package org.smart4j.framework.bean;

import org.smart4j.framework.util.CastUtil;
import org.smart4j.framework.util.CollectionUtil;
import org.smart4j.framework.util.StringUtil;

import java.util.*;

/**
 * 请求参数对象
 *
 *实际上调用的方法参数
 * Created by chinalin on 2017/3/16.
 */
public class Param {

    private List<FormParam> formParamList ;
    private List<FileParam> fileParamList ;

    public Param(List<FormParam> formParamList) {
        this.formParamList = formParamList;
    }

    public Param(List<FormParam> formParamList, List<FileParam> fileParamList) {
        this.formParamList = formParamList;
        this.fileParamList = fileParamList;
    }

    /**
     * 获取请求参数映射
     */
    public Map<String,Object> getFieldMap(){
        Map<String,Object> fieldMap = new HashMap<String ,Object>();
        if (CollectionUtil.isNotEmpty(formParamList)){
            for (FormParam formParam : formParamList){
                String fieldName = formParam.getFieldName() ;
                Object fieldValue = formParam.getFieldValue() ;
                if (fieldMap.containsKey(fieldName)){
                    fieldValue = fieldMap.get(fieldName) + StringUtil.SEPARATOR + fieldValue ;      //多选项时，加入隔离符,例如:checkbox有多个选项。
                }
                fieldMap.put(fieldName, fieldValue) ;
            }
        }
        return fieldMap ;
    }
    /**
     * 获取上传文件映射
     */
    public Map<String,List<FileParam>> getFileMap(){
        Map<String,List<FileParam>> fileMap = new HashMap<String, List<FileParam>>() ;
        if (CollectionUtil.isNotEmpty(fileParamList)){
            for (FileParam fileParam : fileParamList){
                String fieldName = fileParam.getFieldName() ;
                List<FileParam> fileParamList ;
                if (fileMap.containsKey(fieldName)){
                    fileParamList = fileMap.get(fieldName) ;
                }else {
                    fileParamList = new ArrayList<FileParam>() ;
                }
                fileParamList.add(fileParam) ;
                fileMap.put(fieldName,fileParamList) ;
            }
        }
        return fileMap ;
    }
    /**
     * 获取所有上传文件
     */
    public List<FileParam> getFileList(String fieldName){
        return getFileMap().get(fieldName) ;
    }

    /**
     * 获取唯一上传文件
     */
    public FileParam getFile(String fieldName){
        List<FileParam> fileParamList = getFileList(fieldName) ;
        if (CollectionUtil.isNotEmpty(fileParamList) && fileParamList.size() == 1){
            return fileParamList.get(0);
        }
        return  null ;
    }


    /**
     * 根据参数名获取 Long 型参数值
     * 例：param.getLong("id") ;取得用户ID查询
     */
    public long getLong(String name){
        return CastUtil.castLong(getFieldMap().get(name)) ;
    }

    /**
     * 根据参数名获取 int 型参数值
     * 例：param.getLong("id") ;取得用户ID查询
     */
    public int getInt(String name){
        return CastUtil.castInt(getFieldMap().get(name)) ;
    }

    /**
     * 根据参数名获取 boolean 型参数值
     * 例：param.getLong("id") ;取得用户ID查询
     */
    public boolean getBoolean(String name){
        return CastUtil.castBoolean(getFieldMap().get(name)) ;
    }

    /**
     * 获取所有字段信息
     * 例： Map<String, Object> fieldMap = param.getMap();
     * 读取map，一个用户类里的字段数据，controller类提取送入相应的Service类转成写数据库.
     */
//    public Map<String, Object> getMap(){
//        return this.paramMap ;
//    }


    /**
     * 根据参数名获取String 型参数值
     */
    public String getString(String name){
        return CastUtil.castString(getFieldMap().get(name)) ;
    }

    /**
     * 根据参数名获取double 型参数值
     */
    public double getDouble(String name){
        return CastUtil.castDouble(getFieldMap().get(name)) ;
    }

    /**
     * 验证参数是否为空
     * 判断类对象的paramMap是否为空
     * servlet的地址请求时是否带参数 例：http://localhost:8080/chapter2/a.jsp 不带参数。
     */
    public boolean isEmpty(){
        return CollectionUtil.isEmpty(formParamList) && CollectionUtil.isEmpty(fileParamList);
    }
}
